package com.bestcem.xm.ticket.service.manager.notify;

import com.bestcem.xm.ticket.constant.Constants;
import com.bestcem.xm.ticket.service.manager.notify.dto.NotifyMessageDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;

import javax.annotation.Nonnull;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Pattern;

import static com.bestcem.xm.ticket.service.manager.notify.FiledConstant.Email.TEXT_URL_REGEX;

/**
 * 渲染工单通知信息 工具类
 *
 * @author XiaoYunSong <ys.xiao@idiaoyan.com>
 * @version v1.0
 * @date 2021/11/22 14:31
 */
@Slf4j
@Component
public class RenderManager {

    /**
     * 邮件自定义字段 原始链接 样式
     */
    public static final String URL_TEMPLATE = "<a class='blue' href='%s' target='_blank'>%s</a>";
    /**
     * 邮件自定义字段 文字链接 样式
     */
    public static final String TEXT_URL_TEMPLATE = "<a href='%s' style='color:#2672ff' >%s</a>";


    /**
     * 渲染 短信通知 (消息库版)
     *
     * @param message 通知模板
     * @param data    填充字段的数据
     * @return 工单通知内容DTO
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/11/22 15:54
     */
    @Nonnull
    public NotifyMessageDTO smsRender(NotifyMessageDTO message, @Nonnull Map<String, String> data) {
        if (Objects.isNull(message)) {
            log.error("[Ticket] notify smsRender dto null");
            return new NotifyMessageDTO();
        }

        NotifyMessageDTO result = new NotifyMessageDTO();
        // 构建短信主题
        result.setSubject(message.getSubject());

        // 构建短信内容
        String content = formatTemplate(message.getContent(), data);
        result.setContent(content);

        return result;
    }


    /**
     * 渲染 邮件通知 (消息库版)
     *
     * @param message 通知模板
     * @param data    填充字段的数据
     * @return 工单通知内容DTO
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/11/22 15:54
     */
    @Nonnull
    public NotifyMessageDTO emailRender(NotifyMessageDTO message, @Nonnull Map<String, String> data) {
        if (Objects.isNull(message)) {
            log.error("[Ticket] notify emailRender dto null");
            return new NotifyMessageDTO();
        }

        NotifyMessageDTO result = new NotifyMessageDTO();
        // 构建邮件主题
        String subject = formatTemplate(message.getSubject(), data);
        result.setSubject(subject);

        // 构建邮件内容
        String url = data.get(FiledConstant.Email.URL);
        // 这里要把文字链接替换成 <a> 标签
        for (String key : data.keySet()) {
            if (Pattern.matches(TEXT_URL_REGEX, key)) {
                data.put(key, getTextUrl(url, data.get(key)));
            }
        }
        // 这里要把原始链接替换成 <a> 标签
        data.put(FiledConstant.Email.URL, getUrl(url));

        String content = formatTemplate(message.getContent(), data);
        result.setContent(content);

        return result;
    }


    /**
     * 渲染 飞书通知 (触发条件名称版)
     *
     * @param template 通知模板
     * @param data     模板数据
     * @return 工单通知内容
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2022/2/18 11:44
     */
    public String feiShuRender(String template, Map<String, String> data) {
        return formatTemplate(template, data);
    }


    /**
     * 模板格式化 (消息库版)
     *
     * @param template 通知模板
     * @param data     模板填充数据
     * @return 填充完成的内容
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/11/23 11:00
     */
    public static String formatTemplate(String template, @Nonnull Map<String, String> data) {
        if (ObjectUtils.isEmpty(template)) {
            return Constants.BLANK;
        }
        String result = template;
        for (String field : data.keySet()) {
            String value = data.get(field);
            if (ObjectUtils.isEmpty(value)) {
                value = " ";
            }
            result = result.replace(field, value);
        }
        return result;
    }


    /**
     * 获取原始链接
     *
     * @param url 跳转链接
     * @return 原始链接
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/11/23 14:25
     */
    @Nonnull
    private static String getUrl(String url) {
        if (Objects.isNull(url)) {
            url = Constants.BLANK;
        }
        return String.format(URL_TEMPLATE, url, url);
    }


    /**
     * 获取文字链接
     *
     * @param url  跳转链接
     * @param text 展示文字
     * @return 文字链接
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2021/11/23 14:25
     */
    @Nonnull
    private static String getTextUrl(String url, String text) {
        if (Objects.isNull(url)) {
            url = Constants.BLANK;
        }
        if (Objects.isNull(text)) {
            text = Constants.BLANK;
        }
        return String.format(TEXT_URL_TEMPLATE, url, text);
    }
}
